module BinaryTreeHelper
	private
	def add_or_create_node(field, value)
		if instance_variable_get(field).nil?
			instance_variable_set(field, BinaryTreeNode.new(value))
			return true
		else
			return instance_variable_get(field).add(value)
		end
	end
	
	#~ def is_nil_or_not? (field, value)
		#~ return false if instance_variable_get(field).nil?
		#~ return instance_variable_get(field).hasValue?
	#~ end
end

class BinaryTree
	include BinaryTreeHelper

	def add(value)
		add_or_create_node(:@root, value)
	end
end

class BinaryTreeNode
	include BinaryTreeHelper

	def initialize(value)
		@value = value
	end

	def add(value)
		#~ puts "#{value} == #{@value} : #{(value == @value)}"
		#~ return false if value == @value
		if value == @value then
			#~ puts "aaaa"
			return false
		end
		return add_or_create_node(value < @value ? :@left : :@right, value)
	end
	
	#~ def hasValue? (value)
		#~ return true if @value == value
		#~ return is_nil_or_not?(value < @value ? :@left : :@right, value)
	#~ end
end


if $0 == __FILE__ then
	a = BinaryTree.new
	a.add(0)
	a.add(18)
	a.add(5)
	a.add(21)
	a.add(25)
	a.add(31)
	a.add(45)
	a.add(7)
	a.add(2)
	p a.add(1)
	
	p a.add(7)
	p a.add(19)
	p a.add(25)
end
